#include "preproc.h"
#include "multios.h"                                // "фундамент"
#include "interpreter.h"                            // интерпретатор
#include "tree.h"
#include "file.h"
#include "list.h"

int main(int argc, string* args)
{
    gvars                = malloc(sizeof(gvars_t));
    gvars->root_obj      = NULL;
    gvars->last_obj      = NULL;
    gvars->obj_count     = 0;
    gvars->curr_dir      = getcwd(NULL, 0);
    gvars->result        = 0;

    register usint i;                                           // счетчик

    for (i = 0; i < MAX_ALLOCATED_MEM; ++i)                     // цикл инициализации корзины
        trash[i] = NULL;                                        // инициализация элемента корзины

    int a = read_file(CONF_FILE_PATH, NULL);                    // чтение файла конфига

    // show_tree(root_tree, 0, '-');

    if(a == EXIST_ERROR)                                        // проверка открытия файла конфигураций
        printf("comm.conf not found!\n");                       // вывод сообщения об ошибке

    if(a == SYNTAX_ERROR)
        printf("Wrong syntaxis comm.conf!\n");

    string      input = NULL;                                   // описание переменной вводимой строки
    fn_node_t   *view;                                          // описание указателя найденной команды

    prints(MOTD);                                               // вывод MOTD

    while(TRUE)                                                 // основной цикл программы
    {
        clear_trash();                                          // очищение корзины

        input = (string) a_malloc(sizeof(char) * MAX_LEN);      // выделение памяти под строку с вводимой коммандой

        printf("%s%c", gvars->curr_dir, GREETINGS);             // вывод приглашения на ввод

        gets(input);                                            // считывание введенной строки

        if(input[0] == '\n' or input[0] == '\0')                // проверка введенной сторки (строка пуста)
            continue;                                           // переход к следующей итерации

        if(TEST(input, "exit"))                                 // проверка введенного значения (введено "exit")
        {
            del_tree(root_tree);                                // удаление дерева из памяти
            clear_trash();                                      // очищение корзины
            free(gvars->curr_dir);
            return 0;                                           // завершение программы
        }

        if(TEST(input, RELOADCONF_C))                           // проверка введенного значения (введено "reloadconf")
        {
            del_tree(root_tree);

            root_tree = NULL;

            a = read_file(CONF_FILE_PATH, NULL);                // оркрытие файла конфигураций

            if(a == EXIST_ERROR)                                // проверка открытия файла конфигураций (файл не открыт)
                printf("File not exist!\n");                    // вывод сообщения об ошибке
            else if(a == SYNTAX_ERROR)
                printf("File syntaxis error.\n");               // вывод сообщения об успешной подгрузке файла
            else
                printf("File succesfully loaded!\n");

            continue;
        }

        if(TEST(get_cmd(input), LOADCONF_C))                    // проверка введенного значения (введено "reloadconf")
        {
            del_tree(root_tree);

            root_tree = NULL;

            a = read_file((get_args(input))[0], NULL);          // оркрытие файла конфигураций

            if(a == EXIST_ERROR)                                // проверка открытия файла конфигураций (файл не открыт)
                printf("File not exist!\n");                    // вывод сообщения об ошибке
            else if(a == SYNTAX_ERROR)
                printf("File syntaxis error.\n");               // вывод сообщения об успешной подгрузке файла
            else
                printf("File succesfully loaded!\n");

            continue;
        }

        if(TEST(get_cmd(input), SHOWTREE_C))
        {
            show_tree(root_tree, 0, '-');
            continue;
        }

        if(TEST(get_cmd(input), SHOWTRASH_C))
        {
            show_trash("called from main loop");
            continue;
        }

        if(TEST(get_cmd(input), HELP_C))
        {
            if(get_args_count(input))
            {
                view = find_node(get_args(input)[0]);

                if(view)
                    read_file(DESC_FILE_PATH, view->desc);
                else
                    printf("Command doesn't exist!\n");
                continue;
            }
            else
            {
                read_file(HELP_FILE_PATH, NULL);
                continue;
            }
        }

        if(TEST(get_cmd(input), FUNCS_C))
        {
            show_cmds(root_tree);
            continue;
        }

        view = find_node(get_cmd(input));                       // поиск узла дерева

        if(!view)                                               // проверка найденного узна (узел не найден)
        {
            printf(CMD_NOT_FOUND);                              // вывод сообщения об ошибке
            continue;                                           // переход к следующей итерации
        }
        else                                                    // узел найден
        {
            /* вызов функции и вывод ее результата */
            view->fn(get_args_count(input), get_args(input), gvars);

            if(gvars->result != SUCCESS)
            {
                puts(ERROR_STR);
            }
        }
    }

    return 0;

}
